package top.guinguo.analyzer_03.util;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;

import java.io.IOException;
import java.io.StringReader;

/**
 * Created by guin_guo on 2016/12/17.
 * Analyzer：StandardAnalyzer StopAnalyzer SimpleAnalyzer WhitespaceAnalyzer
 * TokenStream：分词器做好处理之后得到的一个流，这个流中存储了分词的各种信息，可以通过TokenStream有效的获取到分词单元
 * Tokenizer：主要负责接受字符流Reader，将Reader进行分词操作
 * TokenFilter：将分词后的语汇单元进行各种各样的过滤
 */
public class AnalyzerUtils {

    public static void displayToken(String str, Analyzer analyzer) {
        //content 不必要的
        try {
            TokenStream stream = analyzer.tokenStream("content", new StringReader(str));
            //创建一个属性，这个属性会添加到流中，随着这个TokenStream增加
            CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
            while (stream.incrementToken()) {
                System.out.print("[" + cta + "]");
            }
            System.out.println();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void displayAllToken(String str, Analyzer analyzer) {
        //content 不必要的
        try {
            TokenStream stream = analyzer.tokenStream("content", new StringReader(str));
            //位置增量的属性，存储语汇单元之间的距离
            PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class);
            //每个语汇单元的位置偏移量
            OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
            //使用的分词器类型信息
            TypeAttribute type = stream.addAttribute(TypeAttribute.class);
            //存储每一个语汇单元的信息（分词单元信息）
            CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
            while (stream.incrementToken()) {
                System.out.println(pia.getPositionIncrement() + ":" + cta + "[" + oa.startOffset() + "-" + oa.endOffset() + "]" + "-->" + type);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
